package com.github.llyb120.qiuya.type;

import com.github.llyb120.qiuya.storage.Qiu;

import java.util.*;

import static com.github.llyb120.qiuya.util.Convert.*;

/**
 * 该类型属于系统自用 禁止手动生成
 */
public final class QCollectionMeta extends LinkedHashMap<String, QCollectionIndex> {
    private int maxColNum;
    private int maxColNameLen;
    private long dataOffset;
//    private VirtualFile vf;
    private Qiu qiu;
    private byte[] bytes;
    //防止手动new出来
    private static boolean inited = false;
//    private Set<String> modified = new HashSet<>();


//    public void put(String key, Long offset){
//
//    }
//
//
//    public Long get(String key){
//        return map.get(key);
//    }


//    @Override
//    public Long put(String key, Long value) {
//        check:{
//            if(containsKey(key)){
//                Long val = get(key);
//                if(!val.equals(value)){
//                    modified.add(key);
//                    break check;
//                }
//            } else {
//                modified.add(key);
//                break check;
//            }
//        }
//        return super.put(key, value);
//    }
//
//    @Override
//    public Long remove(Object key) {
//        if(containsKey(key)){
//            //TODO:
//            //暂时先视为所有都变更了
//            //将来使用链表优化
//            modified.addAll(keySet());
//        }
//        return super.remove(key);
//    }

    /**
     * 最大长度
     *
     * @return
     */
    public static int maxLen(int maxColNum, int maxColNameLen) {
        int total = 0;
        total += Short.BYTES;
        total += Integer.BYTES;
        total += maxColNum * (singleLen(maxColNameLen));
        return total;
    }

    /**
     * 单个元素的长度
     *
     * @param maxColNameLen
     * @return
     */
    public static int singleLen(int maxColNameLen) {
        return Integer.BYTES + maxColNameLen + Long.BYTES;
    }


    public void flush() {
//        int offset = 0;
        //写入类型
//        short2byte(COLLECTION_METADATA.getValue(), bytes, offset);
//        offset += Short.BYTES;
        //写入长度
        int2byte(size(), bytes, 0);
//        offset += Integer.BYTES;
        qiu.vf.writeBytes(dataOffset, bytes, 0, Integer.BYTES);
        for (Map.Entry<String, QCollectionIndex> entry : entrySet()) {
            entry.getValue().flush();
        }
//        for (Map.Entry<String, Long> entry : this.entrySet()) {
////            //不包括直接跳过
////            if(modified.contains(entry.getKey())){
////                offset += singleLen(maxColNameLen);
////                continue;
////            }
//            //写入字符串长度
//            byte[] bs = entry.getKey().getBytes(StandardCharsets.UTF_8);
//            int2byte(bs.length, bytes, offset);
//            offset += Integer.BYTES;
//            //写入字符串
//            byte2byte(bs, bytes, offset);
//            offset += bs.length;
//            //写入便宜
//            longToByteArray(entry.getValue(), bytes, offset);
//            offset += Long.BYTES;
//        }
//        qiu.vf.writeBytes(dataOffset, bytes, 0, offset);
    }

    public QCollectionMeta(Qiu qiu, long vfOffset, int maxCollectionNum, int maxCollectionNameLength, boolean isNew) {
        if (inited) {
            throw new RuntimeException();
        }
        inited = true;
        this.qiu = qiu;
        this.maxColNum = maxCollectionNum;
        this.maxColNameLen = maxCollectionNameLength;
        this.dataOffset = vfOffset;
        this.bytes = qiu.vf.readBytes(vfOffset, maxLen(maxCollectionNum, maxCollectionNameLength));//new byte[meta.maxLen()];

//        if (isNew) {
//            return;
//        }
        int offset = 0;
//        short type = byte2short(bytes, offset);
//        offset += Short.BYTES;
//        assertType(type, COLLECTION_METADATA);
        //读取长度
        int len = byte2int(bytes, offset);
        offset += Integer.BYTES;
//        int indexLen = QCollectionIndex.len(maxCollectionNameLength, maxCollectionNameLength);
        for (int i = 0; i < len; i++) {
            QCollectionIndex index = new QCollectionIndex(qiu, bytes, offset, maxColNameLen,  1000);
            offset += index.byteLength();
//            //读取字符串长度
//            int strlen = byteArrayToInt(bytes, offset);
//            offset += Integer.BYTES;
//            String str = byte2String(bytes, offset, strlen);
//            offset += strlen;
//            //读取偏移量
//            long target = byteArrayToLong(bytes, offset);
//            offset += Long.BYTES;
            put(index.colName, index);
        }
    }


}

